¿Cómo ejecutar aplicaciones gráficas de escritorio de Linux desde Bash Shell de Windows 10?
Primero, instalé Windows Subsystem for Linux (WSL) siguiendo los pasos que se muestran aquí :
(1) Instalado Windows 10 Pro Insider Preview Build 19619.
(2) Distribución Ubuntu Linux instalada.
(3) Cambió la versión de distribución de WSL 1 a WSL 2.
En segundo lugar, para habilitar las aplicaciones gráficas de escritorio de Linux desde Bash Shell de Windows 10, seguí los siguientes pasos como se muestra aquí :
(4) Instalé un servidor X que es Xming
(5) Se instaló el editor vim gráfico basado en GTK como prueba usando:
sudo apt-get install vim-gtk
(6) Establecer mi variable de entorno de visualización
export DISPLAY=:0
(7) Iniciar una aplicación
gvim
Sin embargo, esto no abrió la aplicación y recibí el siguiente error:
E233: cannot open display Press ENTER or type command to continue E852: The child process failed to start the GUI Press ENTER or type command to continue¿Alguna idea de por qué se produce este error?
El subsistema de red en WSL2 es diferente al que se usa en WSL1. Debe tener en cuenta las diferencias para acceder a las aplicaciones de red que se ejecutan en Windows y en Linux:
localhost o 127.0.0.1Hay muchas formas de determinar las direcciones IP en el host de Windows. Puede ejecutar los siguientes comandos en su WSL Linux:
cat /etc/resolv.conf muestra la dirección IP de la interfaz eth0 en Windowsipconfig.exe muestra toda la configuración de IP en el host de Windowsroute.exe print muestra la configuración de enrutamiento de la red en el host de Windows Según la documentación de Microsoft, puede configurar la variable DISPLAY comprobando el servidor de nameserver en el archivo /etc/resolv.conf . ( @fqquiner y @VPraharsha ya mencionaron esto)
export DISPLAY=$(grep nameserver /etc/resolv.conf | awk '{print $2}'):0.0 Sin embargo, tuve problemas al usar esta solución, probablemente porque uso mi computadora portátil con una conexión WiFi y varias redes virtuales. En lugar de la solución anterior, determino la dirección IP de Windows usando route.exe y comprobando la interfaz utilizada en la puerta de enlace predeterminada.
export DISPLAY=$(route.exe print | grep 0.0.0.0 | head -1 | awk '{print $4}'):0.0.profile Puede establecer la variable DISPLAY en su archivo ~/.profile . Use el siguiente código:
# set DISPLAY to use X terminal in WSL # in WSL2 the localhost and network interfaces are not the same than windows if grep -q WSL2 /proc/version; then # execute route.exe in the windows to determine its IP address DISPLAY=$(route.exe print | grep 0.0.0.0 | head -1 | awk '{print $4}'):0.0 else # In WSL1 the DISPLAY can be the localhost address if grep -q icrosoft /proc/version; then DISPLAY=127.0.0.1:0.0 fi fi
Las siguientes instrucciones fueron copiadas y pegadas de un artículo que escribí, pero perdió el formato original, los enlaces y las capturas de pantalla:Fuente: Cómo instalar Ubuntu Desktop con una interfaz gráfica de usuario en WSL2
Descargar VcXsrv: Visite el sitio web oficial Haga clic en "Descargar"
Instale VcXsrv: Abra "vcxsrv-64.1.20.8.1.installer.exe" Haga clic en "Siguiente" Haga clic en "Instalar" Haga clic en "Cerrar"
Permitir acceso a VcXsrv: Marque "Redes privadas" Haga clic en "Permitir acceso"
Abra PowerShell: Presione "⊞ Windows" Ingrese "PowerShell" en la barra de búsqueda Haga clic derecho en "Windows PowerShell" Haga clic en "Ejecutar como administrador"
Abra WSL2: Copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
wsl
Instale Ubuntu Desktop: Copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
sudo apt --yes install ubuntu-desktop
Establezca la variable de nombre de usuario: Copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
username=$(wslvar USERNAME)
Cree el directorio de Ubuntu: Copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
mkdir --parents /mnt/c/users/$username/.ubuntu/
Abra el directorio de Ubuntu: Copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
cd /mnt/c/users/$username/.ubuntu
Descargue el repositorio de software de Linux para productos de Microsoft: Copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
Ubuntu 20.04: wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb --output-document packages-microsoft-prod.deb Ubuntu 18.04: wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb --output-document packages-microsoft-prod.deb
Instale el repositorio de software de Linux para productos de Microsoft: Copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
sudo dpkg --install packages-microsoft-prod.deb
Actualice los repositorios: copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
sudo apt update
Instale APT Transport para HTTPS: Copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
sudo apt install --yes apt-transport-https
Actualice los repositorios: copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
sudo apt update
Instale .Net: Copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
sudo apt install --yes dotnet-sdk-5.0
Agregue Arkane Systems al directorio de la lista de origen: Copie el comando que se encuentra debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
sudo sh -c 'echo "deb [trusted=yes] https://wsl-translinux.arkane-systems.net/apt/ /" > /etc/apt/sources.list.d/wsl-translinux.list'
Actualice los repositorios: copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
sudo apt update
Instale Genie: Copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
sudo apt install --yes systemd-genie
Cree el archivo Sudoers: Copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
echo "$USER ALL=(ALL) NOPASSWD:/usr/bin/genie" | sudo EDITOR="tee" visudo --file /etc/sudoers.d/$USER
Cree el script de escritorio: Copie el código que se encuentra debajo de estas instrucciones Pegue el código en PowerShell Presione "Enter"
# CREATE BASH SCRIPT # Store block of text with here document create_bash_script=$(cat << end_of_string # Define necessary environment variables export DISPLAY="\$(cat /etc/resolv.conf | grep nameserver | awk '{ print \$2 }'):1.0" export DESKTOP_SESSION="ubuntu" export GDMSESSION="ubuntu" export XDG_SESSION_DESKTOP="ubuntu" export XDG_CURRENT_DESKTOP="ubuntu:GNOME" export XDG_SESSION_TYPE="x11" export XDG_BACKEND="x11" export XDG_SESSION_CLASS="user" export XDG_DATA_DIRS="/usr/local/share/:/usr/share/:/var/lib/snapd/desktop" export XDG_CONFIG_DIRS="/etc/xdg" export XDG_RUNTIME_DIR="\$HOME/xdg" export XDG_CONFIG_HOME="\$HOME/.config" export XDG_DATA_HOME="\$HOME/.local/share" export XDG_CACHE_HOME="\$HOME/.cache" export XDG_DESKTOP_DIR="\$HOME/Desktop" export XDG_DOCUMENTS_DIR="\$HOME/Documents" export XDG_DOWNLOAD_DIR="\$HOME/Downloads" export XDG_MUSIC_DIR="\$HOME/Music" export XDG_PICTURES_DIR="\$HOME/Pictures" export XDG_PUBLICSHARE_DIR="\$HOME/Public" export XDG_TEMPLATES_DIR="\$HOME/Templates" export XDG_VIDEOS_DIR="\$HOME/Videos" # Start desktop environment gnome-session end_of_string ) # Store username environment variable in lowercase username=$(wslvar USERNAME | awk '{ print tolower($0) }') && # Save block of text in bash file echo "${create_bash_script}" > "/mnt/c/users/$username/.ubuntu/02_start_desktop.sh"Descargue las imágenes de acceso directo: copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
wget https://assets.ubuntu.com/v1/9fbc8a44-circle-of-friends-web.zip
Descomprima las imágenes de acceso directo: Copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
unzip -o 9fbc8a44-circle-of-friends-web.zip
Cree el icono de acceso directo: copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
convert -resize 64x64 ./circle-of-friends-web/png/cof_orange_hex.png ubuntu.ico
Salga de WSL2: Copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
exit
Cree el script VcXsrv: Copie el código que se encuentra debajo de estas instrucciones Pegue el código en PowerShell Presione "Enter"
# RELOAD VCXSRV SCRIPT # Store username environment variable in lowercase $username = $env:username.tolower() # Store block of text with here-string $reload_vcxsrv_script = @" # Stop vcxsrv proccess that contains "1.0" in the program window title get-process vcxsrv | where { `$_.mainwindowtitle -like "*1.0*" } | stop-process # Start vcxsrv process in a large program window on display number one start-process "c:\program files\vcxsrv\vcxsrv.exe" -argument ":1 -ac -nowgl -multimonitors -dpms" "@ # Save block of text in powershell file echo "${reload_vcxsrv_script}" > $env:userprofile/.ubuntu/reload_vcxsrv.ps1Cree el script de Ubuntu: Copie el código que se encuentra debajo de estas instrucciones Pegue el código en PowerShell Presione "Enter"
# CREATE VISUAL BASIC SCRIPT # Store username environment variable in lowercase $username = $env:username.tolower() # Store block of text with here-string $create_vbs_script = @" ' Run PowerShell script in background set application = createobject("shell.application") application.shellexecute "powershell", "-file c:\users\admin\.ubuntu\01_reload_vcxsrv.ps1", "", "", 0 ' Allow PowerShell script to complete wscript.sleep 3000 ' Run Bash script in background set shell= createobject("wscript.shell") shell.run "wsl sudo genie -c bash /mnt/c/users/admin/.ubuntu/02_start_desktop.sh", 0 "@ # Save block of text in bash file echo "${create_vbs_script}" > $env:userprofile/.ubuntu/03_start_ubuntu.vbsCree la secuencia de comandos de acceso directo: copie el código de debajo de estas instrucciones Pegue el código en PowerShell Presione "Enter"
# Store block of text with here-string $create_shortcut_script = @" # Define location variables `$shortcut_location = "`$env:userprofile\.ubuntu\Ubuntu.lnk" `$program_location = "`$env:userprofile\.ubuntu\03_start_ubuntu.vbs" # Create shortcut `$object = new-object -comobject wscript.shell `$shortcut = `$object.createshortcut(`$shortcut_location) `$shortcut.targetpath = `$program_location `$shortcut.iconlocation = "`$env:userprofile\.ubuntu\ubuntu.ico" `$shortcut.save() "@ # Save block of text in powershell file echo $create_shortcut_script > $env:userprofile/.ubuntu/04_create_shortcut.ps1Abra el directorio de Ubuntu: Copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
cd c:\users\admin\.ubuntu
Cree el acceso directo: copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
powershell.exe -file .\04_create_shortcut.ps1
Abra el Directorio en Explorer: Copie el comando de debajo de estas instrucciones Pegue el comando en PowerShell Presione "Enter"
explorer .
Inicie el escritorio de Ubuntu: haga doble clic en el acceso directo "Ubuntu"
Abra Terminal: haga clic en "Actividades" en la esquina superior izquierda Ingrese "Terminal" en la barra de búsqueda Haga clic en "Terminal"
Deshabilite el bloqueo de pantalla: Copie el comando de debajo de estas instrucciones Pegue el comando en la Terminal Presione "Enter"
gsettings set org.gnome.desktop.screensaver lock-enabled false
Instale Snap Store: Copie el comando de debajo de estas instrucciones Pegue el comando en la Terminal Presione "Enter"
sudo snap install snap-store
Esto funcionó para WSL1, para WSL2 establezca la dirección IP adecuada
Personalmente, uso un enfoque diferente de las otras respuestas aquí, uno que está más en línea con la arquitectura (tal como la entiendo) de la próxima función WSLg (en versión preliminar/beta).
Estoy tan acostumbrado a conectarme a mis diversos sistemas usando Escritorio remoto (también conocido como RDP) que tenía sentido usar xrdp en mi(s) instancia(s) de WSL para aplicaciones gráficas. Esto también me brinda un entorno de escritorio completo, con la capacidad de probar diferentes administradores de escritorio (aunque todavía no he explorado tanto).
Los pasos de instalación en Ubuntu 20.04 son muy sencillos:
sudo apt install xrdp xfce4 # Or whatever desktop manager you want sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini # So it doesn't interfere with Windows RDP on 3389 En /etc/xrdp/startwm.sh , comente las últimas dos líneas (que mencionan Xsession) y agregue:
#test -x /etc/X11/Xsession && exec /etc/X11/Xsession #exec /bin/sh /etc/X11/Xsession exec startxfce4 Inicie xrdp con:
sudo service xrdp start Y eso es todo: debería poder conectarse a su escritorio WSL utilizando la aplicación de conexión de escritorio remoto integrada. La computadora a la que conectarse será localhost:3390 . Asegúrese de que Xorg esté seleccionado como tipo de sesión.
En caso de que alguien no lo supiera, hay una manera más fácil. En2021 , Microsoft nos dio WSLg . 🎉
Básicamente, solo necesita Windows 11 , pero se recomiendan los controladores para vGPU ( Intel AMD Nvidia ) .
WSLg no es compatible con WSL1 . Las nuevas instancias de WSL2 básicamente funcionarán ™ .
Los sistemas WSL2 más antiguos deberán actualizarse una vez:
wsl --updatewsl --shutdown para forzar un reinicio de WSL ¡No olvide eliminar cualquier otra modificación a $DISPLAY que haya realizado!
Aquí hay una sección de solución de problemas para depurar X11 en wsl2:
https://github.com/cascadium/wsl-windows-toolbar-launcher/blob/master/README.md#troubleshooting
El reenvío de puertos no es lo mismo que WSL1: es posible que se pueda acceder a sus servicios de Linux a través de localhost para Windows, pero lo contrario ya no es cierto.
Por lo tanto, debe usar la IP interna de su host de Windows y ajustar el firewall para permitir el paso de la red WSL.
Agregando a la respuesta de fquinner,
Su variable DISPLAY env debe configurarse como export DISPLAY=XXXX:0 para usar la dirección IP del host de Windows como WSL2 y el host de Windows no está en el mismo dispositivo de red, donde XXXX es la dirección IP
y su dirección IP aparece en resolv.conf contra el servidor de nombres ( $ cat /etc/resolv.conf )
o simplemente export DISPLAY="`grep nameserver /etc/resolv.conf | sed 's/nameserver //'`:0" para cargar la dirección IP correcta automáticamente. Además, puede agregar esto a .bashrc o .zshrc (si usa Zsh)
Descubrí que ahora para que la GUI funcione (al menos cuando está en línea) necesita usar su IP pública ...
por ejemplo, ejecutar lo siguiente debería funcionar:
export DISPLAY=$(dig +short myip.opendns.com @resolver1.opendns.com):0Tuve el mismo problema, así que probé estas otras sugerencias, pero lo que terminó funcionando fue permitir que vcxsrv atraviese el firewall público. Sé que no está usando vcxsrv, pero quizás también sea el mismo problema para usted.
Instale VcXsrv y luego habilite el firewall público como estas imágenes. Abra el Firewall de Windows Defender con seguridad avanzada usando wf.msc en el símbolo del sistema. Luego permita conexiones como en estas imágenes.
[ 
Luego ejecute VcXsrv de esta guía para Windows 10 WSL2
Ejecute VcXsrv agregando el parámetro de adición -ac o escriba esto en el símbolo del sistema "C:\Program Files\VcXsrv\vcxsrv.exe" :0 -multiwindow -clipboard -wgl -ac
Luego escriba esto en su terminal WSL2
export DISPLAY_NUMBER="0.0" export DISPLAY=$(grep -m 1 nameserver /etc/resolv.conf | awk '{print $2}'):$DISPLAY_NUMBER export LIBGL_ALWAYS_INDIRECT=1 # OPTIONAL Set the keyboard layout to US setxkbmap -layout us setsid emacs exit